МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИНАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІНСТИТУТ КОМП’ЮТЕРНОЇ ТЕХНІКИ АВТОМАТИКИ ТА МЕТРОЛОГІЇ
«Архітектура комп’ютерів»
ЗВІТ ДО ЛАБОРАТОРНОЇ РОБОТИ №4 ТЕМА:
«Робота з симулятором машини Ноймана. Дослідження архітектури системи команд.»
Підготував: ст.гр КІ-35
Мацюк Т.І.
Прийняв: Клименко В.А.
Львів – 2012
Мета: зрозуміти принципи виконання архітектури системи команд на симуляторі машини Ноймана, зрозуміти і дослідити виконання інструкції.
Завдання: розширити архітектуру систему команд симулятора машини Ноймана, скласти програму на асемблері з розшириним набором команд, перетворити її у машинні коди, запустити симулятор, увести до нього коди машинних, проаналізувати і пояснити отримані результати, довести коректність роботи розширеного набору команд, скласти звіт з виконання лабораторних досліджень та захистити його.
Теоретичні відомості
Загальна схема роботи асемблера складається з 2 проходів. На першому проході асемблер перевіряє коректність синтаксису команд. На другому виконується генерування відповідних машинних команд, тобто числового представлення асемблерної команди.
Функція readAndParse виконує зчитування рядку асемблерної програми і декодування на відповідні поля: мітка, код операції, операнди. Отримана таким чином і декодована інструкція перевіряється на коректність: існування команди, відповідна кількість аргументів, існування міток та т. п.
Функція testRegArg перевіряє коректність використання назви регістра.
Функція testAddrArg перевіряє коректність використання адреси.
Функція labelArray перетворює відповідну мітку у адресу.
Program.as та program.mc – відповідно вхідний та вихідний файли.
Симулятор починає свою роботу ініціалізацією пам’яті та регістрів 0 значеннями (рис. 2.). Наступним кроком відбувається заванаження програми у машинних кодах в пам’ять. Далі відбувається покрокове виконання інструкцій та вивід стану на зовнішній пристрій (чи на екран консолі чи у файл).
У stateStruct зберігається стан машини – значення регістрів, пам’яті та програмний лічільник. stateStruct
Функція Run виконує обробку інструкцій з пам’яті, функція printState виводить поточний стан машини, а функція convertNum виконує перетворення числа у доповняльний код.
Хід виконання роботи:
1. Відкрити вихідні файли з вихідними кодами (assol.c ssol.c)
2. Відкомпілювати дані вихідні коди у окремих проектах.
3. Дослідити алгоритм роботи асемблерної та симуляційної програми.
4. Замінити інструкцію noop власною згідно індивідуального варіанту.
5. Перетворити асемблер ний код у машинний.
6. Запустити симулятор з отриманим у п.5 машинним кодом.
7. Проаналізувати хід виконання машинних інструкцій, перевірити правильність результатів.
8. Скласти звіт по результатам виконання програми.
Виконання лабораторної роботи
14
Інкремент
Фрагменти коду в які були внесені зміни в ході виконання роботи.
asol.c
/* now do second pass (print machine code, with symbols filled in as
addresses) */
rewind(inFilePtr);
for (address=0; readAndParse(inFilePtr, label, opcode, arg0, arg1, arg2);
address++) {
if (!strcmp(opcode, "add")) {
num = (ADD << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16)
| atoi(arg2);
} else if (!strcmp(opcode, "nand")) {
num = (NAND << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16)
| atoi(arg2);
} else if (!strcmp(opcode, "jalr")) {
num = (JALR << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16);
} else if (!strcmp(opcode, "halt")) {
num = (HALT << 22);
} else if (!strcmp(opcode, "INC")) {
num = (INC << 22) | (atoi(arg0) << 19);
} else if (!strcmp(opcode, "lw") || !strcmp(opcode, "sw") ||
!strcmp(opcode, "beq")) {
ssol.c
if (opcode == ADD) {
state.reg[arg2] = state.reg[arg0] + state.reg[arg1];
} else if (opcode == NAND) {
state.reg[arg2] = ~(state.reg[arg0] & state.reg[arg1]);
} else if (opcode == LW) {
if (state.reg[arg0] + addressField < 0 ||
state.reg[arg0] + addressField >= N...